package com.sc.nft.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sc.nft.entity.EquityProps;
import com.sc.nft.entity.UserInfo;
import com.sc.nft.entity.dto.AddEquityPropsGiftDTO;
import com.sc.nft.entity.dto.MerchantAvailabilityListDTO;
import com.sc.nft.entity.dto.UserEquityIdDTO;
import com.sc.nft.entity.dto.VistInFlagDTO;
import com.sc.nft.entity.dto.VistInFlagUserDTO;
import com.sc.nft.entity.vo.AirdropGrantEquityPropsVO;
import com.sc.nft.entity.vo.EquityPropsDetailVO;
import com.sc.nft.entity.vo.EquityPropsExpiredLogPageVO;
import com.sc.nft.entity.vo.EquityPropsGetLogPageVO;
import com.sc.nft.entity.vo.EquityPropsUseLogPageVO;
import com.sc.nft.entity.vo.GetCoinCertificateVO;
import com.sc.nft.entity.vo.MallEquityPropsGetLogPageVO;
import com.sc.nft.entity.vo.MallEquityPropsVO;
import com.sc.nft.entity.vo.MerchantAvailabilityListVO;
import com.sc.nft.entity.vo.PageAdminEquityPropsVO;
import com.sc.nft.entity.vo.ProdctAssociateEquityPropsVO;
import com.sc.nft.entity.vo.UserEquityPropsDetailVO;
import com.sc.nft.enums.EquityPropsTypeEnum;
import com.sc.nft.enums.UserEquityPropsGetTypeEnum;
import com.sc.nft.enums.UserEquityPropsUseTypeEnum;

import java.util.Date;
import java.util.List;

/**
 * 权益道具表服务接口
 *
 * @author Sun
 * @description 由 Mybatisplus Code Generator 创建
 * @since 2023-03-28 10:29:22
 */
public interface EquityPropsService {

    /**
     * 后台分页查询权益道具
     *
     * @param firstTitle
     * @param status
     * @param showFlag
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<PageAdminEquityPropsVO> getPageAdminEquityProps(String firstTitle, Boolean status, Boolean showFlag, Integer pageNo, Integer pageSize);

    /**
     * 添加权益道具
     *
     * @param firstTitle
     * @param creationContent
     * @param productDetails
     * @param isExpired
     * @param expiredDay
     * @param isBrandUse
     * @param typeClassify
     */
    void addEquityProps(String firstTitle, String getRulesUrl, String creationContent, String productDetails, Boolean isExpired, Integer expiredDay, Boolean isBrandUse, EquityPropsTypeEnum typeClassify, Boolean isGift, Integer aging, AddEquityPropsGiftDTO addEquityPropsGiftDTO, Long vistIn, Long daoId);

    /**
     * 编辑权益道具
     *
     * @param id
     * @param firstTitle
     * @param creationContent
     * @param productDetails
     * @param isExpired
     * @param expiredDay
     * @param isBrandUse
     * @param typeClassify
     */
    void editEquityProps(Long id, String getRulesUrl, String firstTitle, String creationContent, String productDetails, Boolean isExpired, Integer expiredDay, Boolean isBrandUse, EquityPropsTypeEnum typeClassify, Boolean isGift, Integer aging, AddEquityPropsGiftDTO addEquityPropsGiftDTO, Long vistIn, Long daoId);

    /**
     * 修改权益道具状态
     *
     * @param id
     */
    void editEquityPropsStatus(Long id, Boolean status);

    /**
     * 商品关联权益道具列表
     *
     * @return
     */
    Page<ProdctAssociateEquityPropsVO> prodctAssociateEquityProps(Integer pageNo, Integer pageSize, String firstTitle);

    /**
     * 根据id获取权益道具
     *
     * @param id
     * @return
     */
    EquityProps getById(Long id);

    /**
     * 可空投权益道具列表
     *
     * @param firstTitle
     * @param typeClassify
     * @return
     */
    Page<AirdropGrantEquityPropsVO> airdropGrantEquityProps(Page page, String firstTitle, Integer typeClassify);

    /**
     * 根据id获取权益道具
     *
     * @param id
     * @return
     */
    GetCoinCertificateVO findByIdGetCoinCertificate(Long id, UserInfo userInfo);

    void editEquityPropsShowFlag(Long id, Boolean showFlag);

    /**
     * 虚拟道具可用列表
     *
     * @param merchantAvailabilityListDTO
     * @return
     */
    Page<MerchantAvailabilityListVO> simpleAvailabilityList(MerchantAvailabilityListDTO merchantAvailabilityListDTO);

    /**
     * equityPropAllPage
     *
     * @return
     */
    Page<MerchantAvailabilityListVO> equityPropAllPage(Page page);

    /**
     * 获取道具卡总览
     *
     * @param firstTitle
     * @return
     */
    EquityPropsDetailVO getDetail(String firstTitle);

    /**
     * 后台分页获取道具卡获取记录
     *
     * @param userTel
     * @param firstTitle
     * @param getType
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<EquityPropsGetLogPageVO> getLog(Long propId, String userTel, String firstTitle, UserEquityPropsGetTypeEnum getType, Date startTime, Date endTime, Integer pageNo, Integer pageSize);

    /**
     * 后台分页获取道具卡使用记录
     *
     * @param userTel
     * @param firstTitle
     * @param useType
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<EquityPropsUseLogPageVO> useLog(String userTel, String firstTitle, UserEquityPropsUseTypeEnum useType, Date startTime, Date endTime, Integer pageNo, Integer pageSize);

    /**
     * 后台分页获取道具卡失效记录
     *
     * @param userTel
     * @param firstTitle
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<EquityPropsExpiredLogPageVO> expiredLog(String userTel, String firstTitle, Date startTime, Date endTime, Integer pageNo, Integer pageSize);

    /**
     * 删除权益道具
     *
     * @param id
     */
    void deleteEquityProps(Long id);

    /**
     * 分页获取长期有效的权益道具
     *
     * @param firstTitle
     * @param type
     * @param page
     * @return
     */
    Page<MerchantAvailabilityListVO> getLongTermEquityPropPage(String firstTitle, Integer type, Page page);

    /**
     * 获取商城上架中的权益道具
     *
     * @return
     */
    IPage<MallEquityPropsVO> getMallEquityProps(VistInFlagDTO vist);

    /**
     * 商城用户持有的权益道具
     *
     * @param vistInFlagUserDTO
     * @return
     */
    List<MallEquityPropsVO> getUserEquityProps(VistInFlagUserDTO vistInFlagUserDTO);

    /**
     * 用户指定权益道具列表
     *
     * @param userEquityIdDTO
     * @return
     */
    Page<UserEquityPropsDetailVO> userEquityIdList(UserEquityIdDTO userEquityIdDTO);

    /**
     * 获取新商城道具获取记录
     *
     * @param userId
     * @param getType
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<MallEquityPropsGetLogPageVO> mallPropsGetLog(Long userId, UserEquityPropsGetTypeEnum getType, Integer pageNo,
                                                      Integer pageSize);
}
